#!/usr/bin/python
# -*- coding: utf-8 -*-
# encoding=utf-8

# !/usr/bin/python
# 此文件是为了下载更多妹子的图片所做的爬虫，嗯抄的
# 以妹子图为例，其实很简单，分以下四步：
#
# 1、获取首页的页码数，并创建与页码对应的文件夹
#
# 2、获取页面的栏目地址
#
# 3、进入栏目，获取栏目页码数(每个栏目下有多张图片，分页显示)
#
# 4、获取到栏目下对用标签中的图片并下载

# 在控制台中输入代码安装必要的库 pip3 install bs4  以及  pip3 install requests
# bs4：beautifulsoup 常用的python爬虫库 用来解析html 版本是4
# requests库：是用python语言基于urllib编写的，采用的是Apache2 Licensed开源协议的HTTP库
# 导入两个库
import requests
# 文件操作库
import os
import bs4
from bs4 import BeautifulSoup
# 基础类库
import sys
# 解决py3的编码问题，如果环境是utf-8就不用以下两句
import importlib

importlib.reload(sys)

global headers
# 定义假浏览器头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'}

# 爬图的地址
mzitu = "http://www.mzitu.com"
# 存储位置
save_path = '/mzt/data/mztu'
# 类别变量
item = ''


# 创建文件夹的方法
def creatDict(filePath):
    # 如果不存在这个路径，则创建文件夹
    if os.path.exists(filePath) is False:
        os.makedirs(filePath)
        # 切换路径至上面创建的dir
    os.chdir(filePath)


# 定义下载方法
# url_with_no 这个是带有页数的url
def download(url_with_no, file_path):
    global headers
    # res_sub是一个response对象
    res_sub = requests.get(url_with_no, headers=headers)
    # 解析html,把response的文本，用html解释器来转成 beautifulsoup对象
    # 用soup_sub.title 获取title标签里的文本 等等
    # https://beautifulsoup.readthedocs.io/zh_CN/latest/
    soup_sub = BeautifulSoup(res_sub.text, 'html.parser')
    # 获取页面的套图链接,所有class为postlist的div下的会跳转新页面的a标签
    all_a = soup_sub.find("div", class_='postlist').find_all("a", target="_blank")
    count = 0
    for a in all_a:
        count += count
        if (count % 2) == 0:
            print("内页第【" + str(count) + "】页")
            # 提取a标签的href属性，进入这个链接找图（一个tag有多个属性 tag.attrs['属性']）
            href = a.attrs['href']
            print("套图链接：" + href)
            res_sub_1 = requests.get(href, headers=headers)
            soup_sub_1 = BeautifulSoup(res_sub_1.text, 'html.parser')
            # 捕获异常处理
            try:
                # 获取套图的最大数量
                pic_max = soup_sub_1.find('div', class_='pagenavi').find_all('span')[6].text
                print("套图数量为：" + pic_max)
                # 从第一页开始
                for j in range(1, int(pic_max) + 1):
                    # 根据规则遍历页数链接
                    href_sub = href + "/" + str(j)
                    print("现在是第" + str(j) + "页，链接是" + href_sub)
                    res_sub_2 = requests.get(href_sub, headers=headers)
                    # parse this html
                    soup_sub_2 = BeautifulSoup(res_sub_2.text, 'html.parser')
                    # 重头戏，图片小姐姐！
                    img = soup_sub_2.find('div', class_='main-image').find('img')
                    # isinstance函数会认为子类是父类的一种类型，考虑继承关系，用来判断两个类型是否相同
                    # isinstance(obj, classinfo),第一个是对象，第二个是类、元组、基本类型
                    if isinstance(img, bs4.element.Tag):
                        # 获取下载的链接
                        src = img.attrs['src']
                        array = src.split('/')
                        # 根据观察发现 链接的最后一串字符串是图片名
                        file_name = array[len(array) - 1]
                        # 防盗链加入Referer
                        headers = {'Referer': href}
                        img_res = requests.get(src, headers=headers)
                        # io,open方法，第一个是文件名，第二个是mode，ab表示 以二进制写入加到结尾处
                        '''
                        --------- ---------------------------------------------------------------
                        'r'       open for reading (default)
                        'w'       open for writing, truncating the file first
                        'x'       create a new file and open it for writing
                        'a'       open for writing, appending to the end of the file if it exists
                        'b'       binary mode
                        't'       text mode (default)
                        '+'       open a disk file for updating (reading and writing)
                        'U'       universal newline mode (deprecated)
                        ========= ===============================================================
                        '''
                        f = open(file_name, 'ab')
                        f.write(img_res.content)
                        f.close()
            except Exception as e:
                print(e)


# main
def main():
    res = requests.get(mzitu, headers=headers)
    # parser this html and then use the method of download
    soup = BeautifulSoup(res.text, 'html.parser')
    # 创建文件夹
    creatDict(save_path)
    # 获取首页总页数
    img_max = soup.find('div', class_='nav-links').find_all('a')[3].text
    page = classify();
    # i从1赋值到img_max，就是第一页到最后一页
    for i in range(1, int(img_max) + 1):
        if i == 1:
            # 第一页直接是主页，但是到了后面就要跟页数的参数了
            page = page
        else:
            page = page + '/page/' + str(i)
        file = save_path + '/' + str(i)
        creatDict(file)
        # 下载每页的图片
        print("图片页码：" + page)
        download(page, file)
        # 下个一页先
        # page = mzitu
        # file = save_path + '/111'
        # creatDict(file)
        # download(page,file)


# 开跑，双下划线是系统定义的变量，自己调自己，__name__就是main
# 如果本文件是import的包，也就是别人调自己，则显示文件名

# 这个方法是区分他要下载哪个分区的
# 性感：xinggan 清纯：mm 日本：japan 台湾：taiwan
# 自拍：zipai（直接是单图） 日更：all（a链接）
def classify():
    action = ['', 'xinggan', 'mm', "japan", "taiwan", "zipai", "all"]
    num = input("欢迎使用美女图，输入0：首页，1：性感，2：清纯，3：日本，4：台湾，5：自拍，6:日更");
    if num in ["0", "1", "2", "3", "4", "5", "6"]:
        print("好的，我们已收到您邪恶的诉求...")
        page = mzitu + action[int(num)] + '/'
        return page
    else:
        print("你在输什么？sb")
        classify()


if __name__ == '__main__':
    main()
'''
emm this program which I copy is for studying python and improve my poor English,
 思路是这样的哈
 1、main方法传入主页的多页
 2、在主页上找到所有栏目的链接
 3、遍历栏目，遍历该栏目下的套图集
 4、进入套图集，因为每张图都是分页的，所以还要遍历所有套图的分页 下载每个分页的img
 5、over
 
 mac启动要到 控制台，sudo -i进入root权限
 进入该文件的目录 用python3来启动，
 其间遇到了编码和权限的 问题 终于下图了😆
'''
